package com.cw.utils.json;

import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONTokener;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.io.StringReader;
import java.util.Map;
import java.util.Set;

/**
 * @author 陈伟
 * @Date: 2022/08/24 18:14
 * @Description:
 * s1、去除json字符串中的属性值前后空格
 * s2、去除xss攻击字符
 * @Version s1.0
 **/
public class JsonValueTrimUtil {

    public static Object jsonStrTrim(String jsonStr){
        if(StringUtils.isBlank(jsonStr)){
            return "";
        }
        JSONConfig jsonConfig = new JSONConfig();
        jsonConfig.setIgnoreNullValue(false);//不去除null值
        jsonConfig.setStripTrailingZeros(false);//不去除末尾多余0
        Object typeObject = new JSONTokener(new StringReader(jsonStr),jsonConfig).nextValue();
        if(typeObject instanceof cn.hutool.json.JSONObject){
            return jsonObjectTrim(JSONObject.parseObject(jsonStr));
        }
        if(typeObject instanceof cn.hutool.json.JSONArray){
            return jsonArrayTrim(JSONArray.parseArray(jsonStr));
        }
        //jsonStr = JsonpUtil.clean(jsonStr);//xss
        return jsonStr.trim();
    }

    public static JSONObject jsonObjectTrim(JSONObject jsonObject){
        //取出jsonObject中的字段的值的空格
        Set<Map.Entry<String,Object>> entrySets = jsonObject.entrySet();
        entrySets.forEach(entry ->{
            Object value = entry.getValue();
            if(value == null){
                jsonObject.put(entry.getKey(),value);
                return;
            }
            if(value instanceof String){
                String resultValue = (String)value;
                if(resultValue!=null){
                    resultValue = resultValue.trim();
                    //resultValue = JsonpUtil.clean(resultValue);//xss
                    jsonObject.put(entry.getKey(),resultValue);
                }
                return;
            }else if(value instanceof JSONObject){
                jsonObject.put(entry.getKey(),jsonObjectTrim((JSONObject)value));
                return;
            }else if(value instanceof JSONArray){
                jsonObject.put(entry.getKey(),jsonArrayTrim((JSONArray)value));
                return;
            }else{
                jsonObject.put(entry.getKey(),value);
                return;
            }
        });
        return jsonObject;
    }

    public static JSONArray jsonArrayTrim(JSONArray arr){
        if(arr !=null && arr.size()>0){
            Object tempObject = null;
            for(int i=0;i<arr.size();i++){
                tempObject =  arr.get(i);
                if(tempObject instanceof String){
                    arr.set(i,tempObject);
                    continue;
                }
                if(tempObject instanceof JSONObject){
                    JSONObject jsonObject = (JSONObject)tempObject;
                    //取出jsonObject中字段的值的空格
                    jsonObject = jsonObjectTrim(jsonObject);
                    arr.set(i,jsonObject);
                }else if(tempObject instanceof JSONArray) {
                    JSONArray jsonArray = (JSONArray) tempObject;
                    //取出jsonArray中字段的值的空格
                    arr.set(i, jsonArrayTrim(jsonArray));
                }else {
                    arr.set(i,tempObject);
                }
            }
        }
        return arr;
    }
}